diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2014-04-11 04:13:21 -0400 |
|---|---|---|
| committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2014-04-24 16:09:01 -0400 |
| commit | 23ef0a895dd3f115909ca70958aeb3d04f374b0d (patch) | |
| tree | 77a3c2f67512073af9b8f3ce6458e4cca4d0084c /drivers/net/can/c_can | |
| parent | 7af28630b87d0b2eefeee8547ad52df7e0e1b1c4 (diff) | |
can: c_can: Cleanup c_can_write_msg_object()
Remove the MASK from the TX transfer side.
Make the code readable and get rid of the annoying IFX_WRITE_XXX_16BIT
macros which are just obfuscating the code.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Alexander Stein <alexander.stein@systec-electronic.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can/c_can')
| -rw-r--r-- | drivers/net/can/c_can/c_can.c | 49 | ||||
| -rw-r--r-- | drivers/net/can/c_can/c_can.h | 8 |
2 files changed, 24 insertions, 33 deletions
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index c654efbcc527..7c60e6affe7a 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c | |||
| @@ -113,9 +113,11 @@ | |||
| 113 | #define IF_COMM_CLR_NEWDAT IF_COMM_TXRQST | 113 | #define IF_COMM_CLR_NEWDAT IF_COMM_TXRQST |
| 114 | #define IF_COMM_DATAA BIT(1) | 114 | #define IF_COMM_DATAA BIT(1) |
| 115 | #define IF_COMM_DATAB BIT(0) | 115 | #define IF_COMM_DATAB BIT(0) |
| 116 | #define IF_COMM_ALL (IF_COMM_MASK | IF_COMM_ARB | \ | 116 | |
| 117 | IF_COMM_CONTROL | IF_COMM_TXRQST | \ | 117 | /* TX buffer setup */ |
| 118 | IF_COMM_DATAA | IF_COMM_DATAB) | 118 | #define IF_COMM_TX (IF_COMM_ARB | IF_COMM_CONTROL | \ |
| 119 | IF_COMM_TXRQST | \ | ||
| 120 | IF_COMM_DATAA | IF_COMM_DATAB) | ||
| 119 | 121 | ||
| 120 | /* For the low buffers we clear the interrupt bit, but keep newdat */ | 122 | /* For the low buffers we clear the interrupt bit, but keep newdat */ |
| 121 | #define IF_COMM_RCV_LOW (IF_COMM_MASK | IF_COMM_ARB | \ | 123 | #define IF_COMM_RCV_LOW (IF_COMM_MASK | IF_COMM_ARB | \ |
| @@ -152,6 +154,8 @@ | |||
| 152 | #define IF_MCONT_RCV (IF_MCONT_RXIE | IF_MCONT_UMASK) | 154 | #define IF_MCONT_RCV (IF_MCONT_RXIE | IF_MCONT_UMASK) |
| 153 | #define IF_MCONT_RCV_EOB (IF_MCONT_RCV | IF_MCONT_EOB) | 155 | #define IF_MCONT_RCV_EOB (IF_MCONT_RCV | IF_MCONT_EOB) |
| 154 | 156 | ||
| 157 | #define IF_MCONT_TX (IF_MCONT_TXIE | IF_MCONT_EOB) | ||
| 158 | |||
| 155 | /* | 159 | /* |
| 156 | * Use IF1 for RX and IF2 for TX | 160 | * Use IF1 for RX and IF2 for TX |
| 157 | */ | 161 | */ |
| @@ -290,40 +294,35 @@ static inline void c_can_object_put(struct net_device *dev, int iface, | |||
| 290 | c_can_obj_update(dev, iface, cmd | IF_COMM_WR, obj); | 294 | c_can_obj_update(dev, iface, cmd | IF_COMM_WR, obj); |
| 291 | } | 295 | } |
| 292 | 296 | ||
| 293 | static void c_can_write_msg_object(struct net_device *dev, | 297 | static void c_can_write_msg_object(struct net_device *dev, int iface, |
| 294 | int iface, struct can_frame *frame, int objno) | 298 | struct can_frame *frame, int obj) |
| 295 | { | 299 | { |
| 296 | int i; | ||
| 297 | u16 flags = 0; | ||
| 298 | unsigned int id; | ||
| 299 | struct c_can_priv *priv = netdev_priv(dev); | 300 | struct c_can_priv *priv = netdev_priv(dev); |
| 300 | 301 | u16 ctrl = IF_MCONT_TX | frame->can_dlc; | |
| 301 | if (!(frame->can_id & CAN_RTR_FLAG)) | 302 | u32 arb = IF_ARB_MSGVAL << 16; |
| 302 | flags |= IF_ARB_TRANSMIT; | 303 | int i; |
| 303 | 304 | ||
| 304 | if (frame->can_id & CAN_EFF_FLAG) { | 305 | if (frame->can_id & CAN_EFF_FLAG) { |
| 305 | id = frame->can_id & CAN_EFF_MASK; | 306 | arb |= frame->can_id & CAN_EFF_MASK; |
| 306 | flags |= IF_ARB_MSGXTD; | 307 | arb |= IF_ARB_MSGXTD << 16; |
| 307 | } else | 308 | } else { |
| 308 | id = ((frame->can_id & CAN_SFF_MASK) << 18); | 309 | arb |= (frame->can_id & CAN_SFF_MASK) << 18; |
| 310 | } | ||
| 309 | 311 | ||
| 310 | flags |= IF_ARB_MSGVAL; | 312 | if (!(frame->can_id & CAN_RTR_FLAG)) |
| 313 | arb |= IF_ARB_TRANSMIT << 16; | ||
| 314 | |||
| 315 | priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), arb); | ||
| 316 | priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), arb >> 16); | ||
| 311 | 317 | ||
| 312 | priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), | 318 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl); |
| 313 | IFX_WRITE_LOW_16BIT(id)); | ||
| 314 | priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), flags | | ||
| 315 | IFX_WRITE_HIGH_16BIT(id)); | ||
| 316 | 319 | ||
| 317 | for (i = 0; i < frame->can_dlc; i += 2) { | 320 | for (i = 0; i < frame->can_dlc; i += 2) { |
| 318 | priv->write_reg(priv, C_CAN_IFACE(DATA1_REG, iface) + i / 2, | 321 | priv->write_reg(priv, C_CAN_IFACE(DATA1_REG, iface) + i / 2, |
| 319 | frame->data[i] | (frame->data[i + 1] << 8)); | 322 | frame->data[i] | (frame->data[i + 1] << 8)); |
| 320 | } | 323 | } |
| 321 | 324 | ||
| 322 | /* enable interrupt for this message object */ | 325 | c_can_object_put(dev, iface, obj, IF_COMM_TX); |
| 323 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), | ||
| 324 | IF_MCONT_TXIE | IF_MCONT_TXRQST | IF_MCONT_EOB | | ||
| 325 | frame->can_dlc); | ||
| 326 | c_can_object_put(dev, iface, objno, IF_COMM_ALL); | ||
| 327 | } | 326 | } |
| 328 | 327 | ||
| 329 | static inline void c_can_activate_all_lower_rx_msg_obj(struct net_device *dev, | 328 | static inline void c_can_activate_all_lower_rx_msg_obj(struct net_device *dev, |
diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h index 792944c74b94..d9f59cc4fcb5 100644 --- a/drivers/net/can/c_can/c_can.h +++ b/drivers/net/can/c_can/c_can.h | |||
| @@ -22,14 +22,6 @@ | |||
| 22 | #ifndef C_CAN_H | 22 | #ifndef C_CAN_H |
| 23 | #define C_CAN_H | 23 | #define C_CAN_H |
| 24 | 24 | ||
| 25 | /* | ||
| 26 | * IFx register masks: | ||
| 27 | * allow easy operation on 16-bit registers when the | ||
| 28 | * argument is 32-bit instead | ||
| 29 | */ | ||
| 30 | #define IFX_WRITE_LOW_16BIT(x) ((x) & 0xFFFF) | ||
| 31 | #define IFX_WRITE_HIGH_16BIT(x) (((x) & 0xFFFF0000) >> 16) | ||
| 32 | |||
| 33 | /* message object split */ | 25 | /* message object split */ |
| 34 | #define C_CAN_NO_OF_OBJECTS 32 | 26 | #define C_CAN_NO_OF_OBJECTS 32 |
| 35 | #define C_CAN_MSG_OBJ_RX_NUM 16 | 27 | #define C_CAN_MSG_OBJ_RX_NUM 16 |
