Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

flexcan: Abstract off read/write for big/little endian.

Make flexcan driver handle register reads in the appropriate endianess.
This was a basic search and replace and then define some inlines.

Signed-off-by: Robin Holt <holt@sgi.com>
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de>
Acked-by: Wolfgang Grandegger <wg@grandegger.com>
Cc: U Bhaskar-B22300 <B22300@freescale.com>
Cc: socketcan-core@lists.berlios.de
Cc: netdev@vger.kernel.org
Cc: PPC list <linuxppc-dev@lists.ozlabs.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

holt@sgi.com and committed by
David S. Miller
61e271ee 12732c30

+83 -57
+83 -57
drivers/net/can/flexcan.c
··· 190 190 }; 191 191 192 192 /* 193 + * Abstract off the read/write for arm versus ppc. 194 + */ 195 + #if defined(__BIG_ENDIAN) 196 + static inline u32 flexcan_read(void __iomem *addr) 197 + { 198 + return in_be32(addr); 199 + } 200 + 201 + static inline void flexcan_write(u32 val, void __iomem *addr) 202 + { 203 + out_be32(addr, val); 204 + } 205 + #else 206 + static inline u32 flexcan_read(void __iomem *addr) 207 + { 208 + return readl(addr); 209 + } 210 + 211 + static inline void flexcan_write(u32 val, void __iomem *addr) 212 + { 213 + writel(val, addr); 214 + } 215 + #endif 216 + 217 + /* 193 218 * Swtich transceiver on or off 194 219 */ 195 220 static void flexcan_transceiver_switch(const struct flexcan_priv *priv, int on) ··· 235 210 struct flexcan_regs __iomem *regs = priv->base; 236 211 u32 reg; 237 212 238 - reg = readl(&regs->mcr); 213 + reg = flexcan_read(&regs->mcr); 239 214 reg &= ~FLEXCAN_MCR_MDIS; 240 - writel(reg, &regs->mcr); 215 + flexcan_write(reg, &regs->mcr); 241 216 242 217 udelay(10); 243 218 } ··· 247 222 struct flexcan_regs __iomem *regs = priv->base; 248 223 u32 reg; 249 224 250 - reg = readl(&regs->mcr); 225 + reg = flexcan_read(&regs->mcr); 251 226 reg |= FLEXCAN_MCR_MDIS; 252 - writel(reg, &regs->mcr); 227 + flexcan_write(reg, &regs->mcr); 253 228 } 254 229 255 230 static int flexcan_get_berr_counter(const struct net_device *dev, ··· 257 232 { 258 233 const struct flexcan_priv *priv = netdev_priv(dev); 259 234 struct flexcan_regs __iomem *regs = priv->base; 260 - u32 reg = readl(&regs->ecr); 235 + u32 reg = flexcan_read(&regs->ecr); 261 236 262 237 bec->txerr = (reg >> 0) & 0xff; 263 238 bec->rxerr = (reg >> 8) & 0xff; ··· 291 266 292 267 if (cf->can_dlc > 0) { 293 268 u32 data = be32_to_cpup((__be32 *)&cf->data[0]); 294 - writel(data, &regs->cantxfg[FLEXCAN_TX_BUF_ID].data[0]); 269 + flexcan_write(data, &regs->cantxfg[FLEXCAN_TX_BUF_ID].data[0]); 295 270 } 296 271 if (cf->can_dlc > 3) { 297 272 u32 data = be32_to_cpup((__be32 *)&cf->data[4]); 298 - writel(data, &regs->cantxfg[FLEXCAN_TX_BUF_ID].data[1]); 273 + flexcan_write(data, &regs->cantxfg[FLEXCAN_TX_BUF_ID].data[1]); 299 274 } 300 275 301 - writel(can_id, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_id); 302 - writel(ctrl, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); 276 + flexcan_write(can_id, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_id); 277 + flexcan_write(ctrl, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl); 303 278 304 279 kfree_skb(skb); 305 280 ··· 487 462 struct flexcan_mb __iomem *mb = &regs->cantxfg[0]; 488 463 u32 reg_ctrl, reg_id; 489 464 490 - reg_ctrl = readl(&mb->can_ctrl); 491 - reg_id = readl(&mb->can_id); 465 + reg_ctrl = flexcan_read(&mb->can_ctrl); 466 + reg_id = flexcan_read(&mb->can_id); 492 467 if (reg_ctrl & FLEXCAN_MB_CNT_IDE) 493 468 cf->can_id = ((reg_id >> 0) & CAN_EFF_MASK) | CAN_EFF_FLAG; 494 469 else ··· 498 473 cf->can_id |= CAN_RTR_FLAG; 499 474 cf->can_dlc = get_can_dlc((reg_ctrl >> 16) & 0xf); 500 475 501 - *(__be32 *)(cf->data + 0) = cpu_to_be32(readl(&mb->data[0])); 502 - *(__be32 *)(cf->data + 4) = cpu_to_be32(readl(&mb->data[1])); 476 + *(__be32 *)(cf->data + 0) = cpu_to_be32(flexcan_read(&mb->data[0])); 477 + *(__be32 *)(cf->data + 4) = cpu_to_be32(flexcan_read(&mb->data[1])); 503 478 504 479 /* mark as read */ 505 - writel(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, &regs->iflag1); 506 - readl(&regs->timer); 480 + flexcan_write(FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, &regs->iflag1); 481 + flexcan_read(&regs->timer); 507 482 } 508 483 509 484 static int flexcan_read_frame(struct net_device *dev) ··· 539 514 * The error bits are cleared on read, 540 515 * use saved value from irq handler. 541 516 */ 542 - reg_esr = readl(&regs->esr) | priv->reg_esr; 517 + reg_esr = flexcan_read(&regs->esr) | priv->reg_esr; 543 518 544 519 /* handle state changes */ 545 520 work_done += flexcan_poll_state(dev, reg_esr); 546 521 547 522 /* handle RX-FIFO */ 548 - reg_iflag1 = readl(&regs->iflag1); 523 + reg_iflag1 = flexcan_read(&regs->iflag1); 549 524 while (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE && 550 525 work_done < quota) { 551 526 work_done += flexcan_read_frame(dev); 552 - reg_iflag1 = readl(&regs->iflag1); 527 + reg_iflag1 = flexcan_read(&regs->iflag1); 553 528 } 554 529 555 530 /* report bus errors */ ··· 559 534 if (work_done < quota) { 560 535 napi_complete(napi); 561 536 /* enable IRQs */ 562 - writel(FLEXCAN_IFLAG_DEFAULT, &regs->imask1); 563 - writel(priv->reg_ctrl_default, &regs->ctrl); 537 + flexcan_write(FLEXCAN_IFLAG_DEFAULT, &regs->imask1); 538 + flexcan_write(priv->reg_ctrl_default, &regs->ctrl); 564 539 } 565 540 566 541 return work_done; ··· 574 549 struct flexcan_regs __iomem *regs = priv->base; 575 550 u32 reg_iflag1, reg_esr; 576 551 577 - reg_iflag1 = readl(&regs->iflag1); 578 - reg_esr = readl(&regs->esr); 579 - writel(FLEXCAN_ESR_ERR_INT, &regs->esr); /* ACK err IRQ */ 552 + reg_iflag1 = flexcan_read(&regs->iflag1); 553 + reg_esr = flexcan_read(&regs->esr); 554 + flexcan_write(FLEXCAN_ESR_ERR_INT, &regs->esr); /* ACK err IRQ */ 580 555 581 556 /* 582 557 * schedule NAPI in case of: ··· 592 567 * save them for later use. 593 568 */ 594 569 priv->reg_esr = reg_esr & FLEXCAN_ESR_ERR_BUS; 595 - writel(FLEXCAN_IFLAG_DEFAULT & ~FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, 596 - &regs->imask1); 597 - writel(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL, 570 + flexcan_write(FLEXCAN_IFLAG_DEFAULT & 571 + ~FLEXCAN_IFLAG_RX_FIFO_AVAILABLE, &regs->imask1); 572 + flexcan_write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL, 598 573 &regs->ctrl); 599 574 napi_schedule(&priv->napi); 600 575 } 601 576 602 577 /* FIFO overflow */ 603 578 if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_OVERFLOW) { 604 - writel(FLEXCAN_IFLAG_RX_FIFO_OVERFLOW, &regs->iflag1); 579 + flexcan_write(FLEXCAN_IFLAG_RX_FIFO_OVERFLOW, &regs->iflag1); 605 580 dev->stats.rx_over_errors++; 606 581 dev->stats.rx_errors++; 607 582 } ··· 610 585 if (reg_iflag1 & (1 << FLEXCAN_TX_BUF_ID)) { 611 586 /* tx_bytes is incremented in flexcan_start_xmit */ 612 587 stats->tx_packets++; 613 - writel((1 << FLEXCAN_TX_BUF_ID), &regs->iflag1); 588 + flexcan_write((1 << FLEXCAN_TX_BUF_ID), &regs->iflag1); 614 589 netif_wake_queue(dev); 615 590 } 616 591 ··· 624 599 struct flexcan_regs __iomem *regs = priv->base; 625 600 u32 reg; 626 601 627 - reg = readl(&regs->ctrl); 602 + reg = flexcan_read(&regs->ctrl); 628 603 reg &= ~(FLEXCAN_CTRL_PRESDIV(0xff) | 629 604 FLEXCAN_CTRL_RJW(0x3) | 630 605 FLEXCAN_CTRL_PSEG1(0x7) | ··· 648 623 reg |= FLEXCAN_CTRL_SMP; 649 624 650 625 dev_info(dev->dev.parent, "writing ctrl=0x%08x\n", reg); 651 - writel(reg, &regs->ctrl); 626 + flexcan_write(reg, &regs->ctrl); 652 627 653 628 /* print chip status */ 654 629 dev_dbg(dev->dev.parent, "%s: mcr=0x%08x ctrl=0x%08x\n", __func__, 655 - readl(&regs->mcr), readl(&regs->ctrl)); 630 + flexcan_read(&regs->mcr), flexcan_read(&regs->ctrl)); 656 631 } 657 632 658 633 /* ··· 673 648 flexcan_chip_enable(priv); 674 649 675 650 /* soft reset */ 676 - writel(FLEXCAN_MCR_SOFTRST, &regs->mcr); 651 + flexcan_write(FLEXCAN_MCR_SOFTRST, &regs->mcr); 677 652 udelay(10); 678 653 679 - reg_mcr = readl(&regs->mcr); 654 + reg_mcr = flexcan_read(&regs->mcr); 680 655 if (reg_mcr & FLEXCAN_MCR_SOFTRST) { 681 656 dev_err(dev->dev.parent, 682 657 "Failed to softreset can module (mcr=0x%08x)\n", ··· 698 673 * choose format C 699 674 * 700 675 */ 701 - reg_mcr = readl(&regs->mcr); 676 + reg_mcr = flexcan_read(&regs->mcr); 702 677 reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_FEN | FLEXCAN_MCR_HALT | 703 678 FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | 704 679 FLEXCAN_MCR_IDAM_C; 705 680 dev_dbg(dev->dev.parent, "%s: writing mcr=0x%08x", __func__, reg_mcr); 706 - writel(reg_mcr, &regs->mcr); 681 + flexcan_write(reg_mcr, &regs->mcr); 707 682 708 683 /* 709 684 * CTRL ··· 721 696 * (FLEXCAN_CTRL_ERR_MSK), too. Otherwise we don't get any 722 697 * warning or bus passive interrupts. 723 698 */ 724 - reg_ctrl = readl(&regs->ctrl); 699 + reg_ctrl = flexcan_read(&regs->ctrl); 725 700 reg_ctrl &= ~FLEXCAN_CTRL_TSYN; 726 701 reg_ctrl |= FLEXCAN_CTRL_BOFF_REC | FLEXCAN_CTRL_LBUF | 727 702 FLEXCAN_CTRL_ERR_STATE | FLEXCAN_CTRL_ERR_MSK; ··· 729 704 /* save for later use */ 730 705 priv->reg_ctrl_default = reg_ctrl; 731 706 dev_dbg(dev->dev.parent, "%s: writing ctrl=0x%08x", __func__, reg_ctrl); 732 - writel(reg_ctrl, &regs->ctrl); 707 + flexcan_write(reg_ctrl, &regs->ctrl); 733 708 734 709 for (i = 0; i < ARRAY_SIZE(regs->cantxfg); i++) { 735 - writel(0, &regs->cantxfg[i].can_ctrl); 736 - writel(0, &regs->cantxfg[i].can_id); 737 - writel(0, &regs->cantxfg[i].data[0]); 738 - writel(0, &regs->cantxfg[i].data[1]); 710 + flexcan_write(0, &regs->cantxfg[i].can_ctrl); 711 + flexcan_write(0, &regs->cantxfg[i].can_id); 712 + flexcan_write(0, &regs->cantxfg[i].data[0]); 713 + flexcan_write(0, &regs->cantxfg[i].data[1]); 739 714 740 715 /* put MB into rx queue */ 741 - writel(FLEXCAN_MB_CNT_CODE(0x4), &regs->cantxfg[i].can_ctrl); 716 + flexcan_write(FLEXCAN_MB_CNT_CODE(0x4), 717 + &regs->cantxfg[i].can_ctrl); 742 718 } 743 719 744 720 /* acceptance mask/acceptance code (accept everything) */ 745 - writel(0x0, &regs->rxgmask); 746 - writel(0x0, &regs->rx14mask); 747 - writel(0x0, &regs->rx15mask); 721 + flexcan_write(0x0, &regs->rxgmask); 722 + flexcan_write(0x0, &regs->rx14mask); 723 + flexcan_write(0x0, &regs->rx15mask); 748 724 749 725 flexcan_transceiver_switch(priv, 1); 750 726 751 727 /* synchronize with the can bus */ 752 - reg_mcr = readl(&regs->mcr); 728 + reg_mcr = flexcan_read(&regs->mcr); 753 729 reg_mcr &= ~FLEXCAN_MCR_HALT; 754 - writel(reg_mcr, &regs->mcr); 730 + flexcan_write(reg_mcr, &regs->mcr); 755 731 756 732 priv->can.state = CAN_STATE_ERROR_ACTIVE; 757 733 758 734 /* enable FIFO interrupts */ 759 - writel(FLEXCAN_IFLAG_DEFAULT, &regs->imask1); 735 + flexcan_write(FLEXCAN_IFLAG_DEFAULT, &regs->imask1); 760 736 761 737 /* print chip status */ 762 738 dev_dbg(dev->dev.parent, "%s: reading mcr=0x%08x ctrl=0x%08x\n", 763 - __func__, readl(&regs->mcr), readl(&regs->ctrl)); 739 + __func__, flexcan_read(&regs->mcr), flexcan_read(&regs->ctrl)); 764 740 765 741 return 0; 766 742 ··· 783 757 u32 reg; 784 758 785 759 /* Disable all interrupts */ 786 - writel(0, &regs->imask1); 760 + flexcan_write(0, &regs->imask1); 787 761 788 762 /* Disable + halt module */ 789 - reg = readl(&regs->mcr); 763 + reg = flexcan_read(&regs->mcr); 790 764 reg |= FLEXCAN_MCR_MDIS | FLEXCAN_MCR_HALT; 791 - writel(reg, &regs->mcr); 765 + flexcan_write(reg, &regs->mcr); 792 766 793 767 flexcan_transceiver_switch(priv, 0); 794 768 priv->can.state = CAN_STATE_STOPPED; ··· 880 854 881 855 /* select "bus clock", chip must be disabled */ 882 856 flexcan_chip_disable(priv); 883 - reg = readl(&regs->ctrl); 857 + reg = flexcan_read(&regs->ctrl); 884 858 reg |= FLEXCAN_CTRL_CLK_SRC; 885 - writel(reg, &regs->ctrl); 859 + flexcan_write(reg, &regs->ctrl); 886 860 887 861 flexcan_chip_enable(priv); 888 862 889 863 /* set freeze, halt and activate FIFO, restrict register access */ 890 - reg = readl(&regs->mcr); 864 + reg = flexcan_read(&regs->mcr); 891 865 reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | 892 866 FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV; 893 - writel(reg, &regs->mcr); 867 + flexcan_write(reg, &regs->mcr); 894 868 895 869 /* 896 870 * Currently we only support newer versions of this core 897 871 * featuring a RX FIFO. Older cores found on some Coldfire 898 872 * derivates are not yet supported. 899 873 */ 900 - reg = readl(&regs->mcr); 874 + reg = flexcan_read(&regs->mcr); 901 875 if (!(reg & FLEXCAN_MCR_FEN)) { 902 876 dev_err(dev->dev.parent, 903 877 "Could not enable RX FIFO, unsupported core\n");