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

net: irda: pxaficp_ir: convert to readl and writel

Convert the pxa IRDA driver to readl and writel primitives, and remove
another set of direct registers access. This leaves only the DMA
registers access, which will be dealt with dmaengine conversion.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Tested-by: Petr Cvek <petr.cvek@tul.cz>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Robert Jarzmik and committed by
David S. Miller
89fa5724 be01891e

+126 -84
+126 -84
drivers/net/irda/pxaficp_ir.c
··· 29 29 30 30 #include <mach/dma.h> 31 31 #include <linux/platform_data/irda-pxaficp.h> 32 + #undef __REG 33 + #define __REG(x) ((x) & 0xffff) 32 34 #include <mach/regs-uart.h> 33 35 34 - #define FICP __REG(0x40800000) /* Start of FICP area */ 35 - #define ICCR0 __REG(0x40800000) /* ICP Control Register 0 */ 36 - #define ICCR1 __REG(0x40800004) /* ICP Control Register 1 */ 37 - #define ICCR2 __REG(0x40800008) /* ICP Control Register 2 */ 38 - #define ICDR __REG(0x4080000c) /* ICP Data Register */ 39 - #define ICSR0 __REG(0x40800014) /* ICP Status Register 0 */ 40 - #define ICSR1 __REG(0x40800018) /* ICP Status Register 1 */ 36 + #define ICCR0 0x0000 /* ICP Control Register 0 */ 37 + #define ICCR1 0x0004 /* ICP Control Register 1 */ 38 + #define ICCR2 0x0008 /* ICP Control Register 2 */ 39 + #define ICDR 0x000c /* ICP Data Register */ 40 + #define ICSR0 0x0014 /* ICP Status Register 0 */ 41 + #define ICSR1 0x0018 /* ICP Status Register 1 */ 41 42 42 43 #define ICCR0_AME (1 << 7) /* Address match enable */ 43 44 #define ICCR0_TIE (1 << 6) /* Transmit FIFO interrupt enable */ ··· 56 55 #define ICCR2_TRIG_16 (1 << 0) /* >= 16 bytes */ 57 56 #define ICCR2_TRIG_32 (2 << 0) /* >= 32 bytes */ 58 57 59 - #ifdef CONFIG_PXA27x 60 58 #define ICSR0_EOC (1 << 6) /* DMA End of Descriptor Chain */ 61 - #endif 62 59 #define ICSR0_FRE (1 << 5) /* Framing error */ 63 60 #define ICSR0_RFS (1 << 4) /* Receive FIFO service request */ 64 61 #define ICSR0_TFS (1 << 3) /* Transnit FIFO service request */ ··· 97 98 IrSR_RCVEIR_UART_MODE | \ 98 99 IrSR_XMITIR_IR_MODE) 99 100 101 + /* macros for registers read/write */ 102 + #define ficp_writel(irda, val, off) \ 103 + do { \ 104 + dev_vdbg(irda->dev, \ 105 + "%s():%d ficp_writel(0x%x, %s)\n", \ 106 + __func__, __LINE__, (val), #off); \ 107 + writel_relaxed((val), (irda)->irda_base + (off)); \ 108 + } while (0) 109 + 110 + #define ficp_readl(irda, off) \ 111 + ({ \ 112 + unsigned int _v; \ 113 + _v = readl_relaxed((irda)->irda_base + (off)); \ 114 + dev_vdbg(irda->dev, \ 115 + "%s():%d ficp_readl(%s): 0x%x\n", \ 116 + __func__, __LINE__, #off, _v); \ 117 + _v; \ 118 + }) 119 + 120 + #define stuart_writel(irda, val, off) \ 121 + do { \ 122 + dev_vdbg(irda->dev, \ 123 + "%s():%d stuart_writel(0x%x, %s)\n", \ 124 + __func__, __LINE__, (val), #off); \ 125 + writel_relaxed((val), (irda)->stuart_base + (off)); \ 126 + } while (0) 127 + 128 + #define stuart_readl(irda, off) \ 129 + ({ \ 130 + unsigned int _v; \ 131 + _v = readl_relaxed((irda)->stuart_base + (off)); \ 132 + dev_vdbg(irda->dev, \ 133 + "%s():%d stuart_readl(%s): 0x%x\n", \ 134 + __func__, __LINE__, #off, _v); \ 135 + _v; \ 136 + }) 137 + 100 138 struct pxa_irda { 101 139 int speed; 102 140 int newspeed; 103 141 unsigned long long last_clk; 104 142 143 + void __iomem *stuart_base; 144 + void __iomem *irda_base; 105 145 unsigned char *dma_rx_buff; 106 146 unsigned char *dma_tx_buff; 107 147 dma_addr_t dma_rx_buff_phy; ··· 191 153 inline static void pxa_irda_fir_dma_rx_start(struct pxa_irda *si) 192 154 { 193 155 DCSR(si->rxdma) = DCSR_NODESC; 194 - DSADR(si->rxdma) = __PREG(ICDR); 156 + DSADR(si->rxdma) = (unsigned long)si->irda_base + ICDR; 195 157 DTADR(si->rxdma) = si->dma_rx_buff_phy; 196 158 DCMD(si->rxdma) = DCMD_INCTRGADDR | DCMD_FLOWSRC | DCMD_WIDTH1 | DCMD_BURST32 | IRDA_FRAME_SIZE_LIMIT; 197 159 DCSR(si->rxdma) |= DCSR_RUN; ··· 201 163 { 202 164 DCSR(si->txdma) = DCSR_NODESC; 203 165 DSADR(si->txdma) = si->dma_tx_buff_phy; 204 - DTADR(si->txdma) = __PREG(ICDR); 166 + DTADR(si->txdma) = (unsigned long)si->irda_base + ICDR; 205 167 DCMD(si->txdma) = DCMD_INCSRCADDR | DCMD_FLOWTRG | DCMD_ENDIRQEN | DCMD_WIDTH1 | DCMD_BURST32 | si->dma_tx_buff_len; 206 168 DCSR(si->txdma) |= DCSR_RUN; 207 169 } ··· 244 206 /* stop RX DMA */ 245 207 DCSR(si->rxdma) &= ~DCSR_RUN; 246 208 /* disable FICP */ 247 - ICCR0 = 0; 209 + ficp_writel(si, 0, ICCR0); 248 210 pxa_irda_disable_clk(si); 249 211 250 212 /* set board transceiver to SIR mode */ ··· 255 217 } 256 218 257 219 /* disable STUART first */ 258 - STIER = 0; 220 + stuart_writel(si, 0, STIER); 259 221 260 222 /* access DLL & DLH */ 261 - STLCR |= LCR_DLAB; 262 - STDLL = divisor & 0xff; 263 - STDLH = divisor >> 8; 264 - STLCR &= ~LCR_DLAB; 223 + stuart_writel(si, stuart_readl(si, STLCR) | LCR_DLAB, STLCR); 224 + stuart_writel(si, divisor & 0xff, STDLL); 225 + stuart_writel(si, divisor >> 8, STDLH); 226 + stuart_writel(si, stuart_readl(si, STLCR) & ~LCR_DLAB, STLCR); 265 227 266 228 si->speed = speed; 267 - STISR = IrSR_IR_RECEIVE_ON | IrSR_XMODE_PULSE_1_6; 268 - STIER = IER_UUE | IER_RLSE | IER_RAVIE | IER_RTIOE; 229 + stuart_writel(si, IrSR_IR_RECEIVE_ON | IrSR_XMODE_PULSE_1_6, 230 + STISR); 231 + stuart_writel(si, IER_UUE | IER_RLSE | IER_RAVIE | IER_RTIOE, 232 + STIER); 269 233 270 234 local_irq_restore(flags); 271 235 break; ··· 276 236 local_irq_save(flags); 277 237 278 238 /* disable STUART */ 279 - STIER = 0; 280 - STISR = 0; 239 + stuart_writel(si, 0, STIER); 240 + stuart_writel(si, 0, STISR); 281 241 pxa_irda_disable_clk(si); 282 242 283 243 /* disable FICP first */ 284 - ICCR0 = 0; 244 + ficp_writel(si, 0, ICCR0); 285 245 286 246 /* set board transceiver to FIR mode */ 287 247 pxa_irda_set_mode(si, IR_FIRMODE); ··· 291 251 292 252 si->speed = speed; 293 253 pxa_irda_fir_dma_rx_start(si); 294 - ICCR0 = ICCR0_ITR | ICCR0_RXE; 254 + ficp_writel(si, ICCR0_ITR | ICCR0_RXE, ICCR0); 295 255 296 256 local_irq_restore(flags); 297 257 break; ··· 310 270 struct pxa_irda *si = netdev_priv(dev); 311 271 int iir, lsr, data; 312 272 313 - iir = STIIR; 273 + iir = stuart_readl(si, STIIR); 314 274 315 275 switch (iir & 0x0F) { 316 276 case 0x06: /* Receiver Line Status */ 317 - lsr = STLSR; 277 + lsr = stuart_readl(si, STLSR); 318 278 while (lsr & LSR_FIFOE) { 319 - data = STRBR; 279 + data = stuart_readl(si, STRBR); 320 280 if (lsr & (LSR_OE | LSR_PE | LSR_FE | LSR_BI)) { 321 281 printk(KERN_DEBUG "pxa_ir: sir receiving error\n"); 322 282 dev->stats.rx_errors++; ··· 329 289 async_unwrap_char(dev, &dev->stats, 330 290 &si->rx_buff, data); 331 291 } 332 - lsr = STLSR; 292 + lsr = stuart_readl(si, STLSR); 333 293 } 334 294 si->last_clk = sched_clock(); 335 295 break; ··· 340 300 case 0x0C: /* Character Timeout Indication */ 341 301 do { 342 302 dev->stats.rx_bytes++; 343 - async_unwrap_char(dev, &dev->stats, &si->rx_buff, STRBR); 344 - } while (STLSR & LSR_DR); 303 + async_unwrap_char(dev, &dev->stats, &si->rx_buff, 304 + stuart_readl(si, STRBR)); 305 + } while (stuart_readl(si, STLSR) & LSR_DR); 345 306 si->last_clk = sched_clock(); 346 307 break; 347 308 348 309 case 0x02: /* Transmit FIFO Data Request */ 349 - while ((si->tx_buff.len) && (STLSR & LSR_TDRQ)) { 350 - STTHR = *si->tx_buff.data++; 310 + while ((si->tx_buff.len) && 311 + (stuart_readl(si, STLSR) & LSR_TDRQ)) { 312 + stuart_writel(si, *si->tx_buff.data++, STTHR); 351 313 si->tx_buff.len -= 1; 352 314 } 353 315 ··· 358 316 dev->stats.tx_bytes += si->tx_buff.data - si->tx_buff.head; 359 317 360 318 /* We need to ensure that the transmitter has finished. */ 361 - while ((STLSR & LSR_TEMT) == 0) 319 + while ((stuart_readl(si, STLSR) & LSR_TEMT) == 0) 362 320 cpu_relax(); 363 321 si->last_clk = sched_clock(); 364 322 ··· 372 330 si->newspeed = 0; 373 331 } else { 374 332 /* enable IR Receiver, disable IR Transmitter */ 375 - STISR = IrSR_IR_RECEIVE_ON | IrSR_XMODE_PULSE_1_6; 333 + stuart_writel(si, IrSR_IR_RECEIVE_ON | 334 + IrSR_XMODE_PULSE_1_6, STISR); 376 335 /* enable STUART and receive interrupts */ 377 - STIER = IER_UUE | IER_RLSE | IER_RAVIE | IER_RTIOE; 336 + stuart_writel(si, IER_UUE | IER_RLSE | 337 + IER_RAVIE | IER_RTIOE, STIER); 378 338 } 379 339 /* I'm hungry! */ 380 340 netif_wake_queue(dev); ··· 414 370 dev->stats.tx_errors++; 415 371 } 416 372 417 - while (ICSR1 & ICSR1_TBY) 373 + while (ficp_readl(si, ICSR1) & ICSR1_TBY) 418 374 cpu_relax(); 419 375 si->last_clk = sched_clock(); 420 376 ··· 430 386 } else { 431 387 int i = 64; 432 388 433 - ICCR0 = 0; 389 + ficp_writel(si, 0, ICCR0); 434 390 pxa_irda_fir_dma_rx_start(si); 435 - while ((ICSR1 & ICSR1_RNE) && i--) 436 - (void)ICDR; 437 - ICCR0 = ICCR0_ITR | ICCR0_RXE; 391 + while ((ficp_readl(si, ICSR1) & ICSR1_RNE) && i--) 392 + ficp_readl(si, ICDR); 393 + ficp_writel(si, ICCR0_ITR | ICCR0_RXE, ICCR0); 438 394 439 395 if (i < 0) 440 396 printk(KERN_ERR "pxa_ir: cannot clear Rx FIFO!\n"); ··· 452 408 453 409 do { 454 410 /* Read Status, and then Data. */ 455 - stat = ICSR1; 411 + stat = ficp_readl(si, ICSR1); 456 412 rmb(); 457 - data = ICDR; 413 + data = ficp_readl(si, ICDR); 458 414 459 415 if (stat & (ICSR1_CRE | ICSR1_ROR)) { 460 416 dev->stats.rx_errors++; ··· 472 428 /* If we hit the end of frame, there's no point in continuing. */ 473 429 if (stat & ICSR1_EOF) 474 430 break; 475 - } while (ICSR0 & ICSR0_EIF); 431 + } while (ficp_readl(si, ICSR0) & ICSR0_EIF); 476 432 477 433 if (stat & ICSR1_EOF) { 478 434 /* end of frame. */ ··· 516 472 517 473 /* stop RX DMA */ 518 474 DCSR(si->rxdma) &= ~DCSR_RUN; 519 - icsr0 = ICSR0; 520 475 si->last_clk = sched_clock(); 476 + icsr0 = ficp_readl(si, ICSR0); 521 477 522 478 if (icsr0 & (ICSR0_FRE | ICSR0_RAB)) { 523 479 if (icsr0 & ICSR0_FRE) { ··· 527 483 printk(KERN_DEBUG "pxa_ir: fir receive abort\n"); 528 484 dev->stats.rx_errors++; 529 485 } 530 - ICSR0 = icsr0 & (ICSR0_FRE | ICSR0_RAB); 486 + ficp_writel(si, icsr0 & (ICSR0_FRE | ICSR0_RAB), ICSR0); 531 487 } 532 488 533 489 if (icsr0 & ICSR0_EIF) { ··· 535 491 pxa_irda_fir_irq_eif(si, dev, icsr0); 536 492 } 537 493 538 - ICCR0 = 0; 494 + ficp_writel(si, 0, ICCR0); 539 495 pxa_irda_fir_dma_rx_start(si); 540 - while ((ICSR1 & ICSR1_RNE) && i--) 541 - (void)ICDR; 542 - ICCR0 = ICCR0_ITR | ICCR0_RXE; 496 + while ((ficp_readl(si, ICSR1) & ICSR1_RNE) && i--) 497 + ficp_readl(si, ICDR); 498 + ficp_writel(si, ICCR0_ITR | ICCR0_RXE, ICCR0); 543 499 544 500 if (i < 0) 545 501 printk(KERN_ERR "pxa_ir: cannot clear Rx FIFO!\n"); ··· 580 536 si->tx_buff.len = async_wrap_skb(skb, si->tx_buff.data, si->tx_buff.truesize); 581 537 582 538 /* Disable STUART interrupts and switch to transmit mode. */ 583 - STIER = 0; 584 - STISR = IrSR_IR_TRANSMIT_ON | IrSR_XMODE_PULSE_1_6; 539 + stuart_writel(si, 0, STIER); 540 + stuart_writel(si, IrSR_IR_TRANSMIT_ON | IrSR_XMODE_PULSE_1_6, 541 + STISR); 585 542 586 543 /* enable STUART and transmit interrupts */ 587 - STIER = IER_UUE | IER_TIE; 544 + stuart_writel(si, IER_UUE | IER_TIE, STIER); 588 545 } else { 589 546 unsigned long mtt = irda_get_mtt(skb); 590 547 ··· 598 553 599 554 /* stop RX DMA, disable FICP */ 600 555 DCSR(si->rxdma) &= ~DCSR_RUN; 601 - ICCR0 = 0; 556 + ficp_writel(si, 0, ICCR0); 602 557 603 558 pxa_irda_fir_dma_tx_start(si); 604 - ICCR0 = ICCR0_ITR | ICCR0_TXE; 559 + ficp_writel(si, ICCR0_ITR | ICCR0_TXE, ICCR0); 605 560 } 606 561 607 562 dev_kfree_skb(skb); ··· 657 612 static void pxa_irda_startup(struct pxa_irda *si) 658 613 { 659 614 /* Disable STUART interrupts */ 660 - STIER = 0; 615 + stuart_writel(si, 0, STIER); 661 616 /* enable STUART interrupt to the processor */ 662 - STMCR = MCR_OUT2; 617 + stuart_writel(si, MCR_OUT2, STMCR); 663 618 /* configure SIR frame format: StartBit - Data 7 ... Data 0 - Stop Bit */ 664 - STLCR = LCR_WLS0 | LCR_WLS1; 619 + stuart_writel(si, LCR_WLS0 | LCR_WLS1, STLCR); 665 620 /* enable FIFO, we use FIFO to improve performance */ 666 - STFCR = FCR_TRFIFOE | FCR_ITL_32; 621 + stuart_writel(si, FCR_TRFIFOE | FCR_ITL_32, STFCR); 667 622 668 623 /* disable FICP */ 669 - ICCR0 = 0; 624 + ficp_writel(si, 0, ICCR0); 670 625 /* configure FICP ICCR2 */ 671 - ICCR2 = ICCR2_TXP | ICCR2_TRIG_32; 626 + ficp_writel(si, ICCR2_TXP | ICCR2_TRIG_32, ICCR2); 672 627 673 628 /* configure DMAC */ 674 629 DRCMR(17) = si->rxdma | DRCMR_MAPVLD; ··· 688 643 local_irq_save(flags); 689 644 690 645 /* disable STUART and interrupt */ 691 - STIER = 0; 646 + stuart_writel(si, 0, STIER); 692 647 /* disable STUART SIR mode */ 693 - STISR = 0; 648 + stuart_writel(si, 0, STISR); 694 649 695 650 /* disable DMA */ 696 651 DCSR(si->txdma) &= ~DCSR_RUN; 697 652 DCSR(si->rxdma) &= ~DCSR_RUN; 698 653 /* disable FICP */ 699 - ICCR0 = 0; 654 + ficp_writel(si, 0, ICCR0); 700 655 701 656 /* disable the STUART or FICP clocks */ 702 657 pxa_irda_disable_clk(si); ··· 874 829 static int pxa_irda_probe(struct platform_device *pdev) 875 830 { 876 831 struct net_device *dev; 832 + struct resource *res; 877 833 struct pxa_irda *si; 834 + void __iomem *ficp, *stuart; 878 835 unsigned int baudrate_mask; 879 836 int err; 880 837 881 838 if (!pdev->dev.platform_data) 882 839 return -ENODEV; 883 840 884 - err = request_mem_region(__PREG(STUART), 0x24, "IrDA") ? 0 : -EBUSY; 885 - if (err) 886 - goto err_mem_1; 841 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 842 + ficp = devm_ioremap_resource(&pdev->dev, res); 843 + if (IS_ERR(ficp)) { 844 + dev_err(&pdev->dev, "resource ficp not defined\n"); 845 + return PTR_ERR(ficp); 846 + } 887 847 888 - err = request_mem_region(__PREG(FICP), 0x1c, "IrDA") ? 0 : -EBUSY; 889 - if (err) 890 - goto err_mem_2; 848 + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 849 + stuart = devm_ioremap_resource(&pdev->dev, res); 850 + if (IS_ERR(stuart)) { 851 + dev_err(&pdev->dev, "resource stuart not defined\n"); 852 + return PTR_ERR(stuart); 853 + } 891 854 892 855 dev = alloc_irdadev(sizeof(struct pxa_irda)); 893 856 if (!dev) { 894 857 err = -ENOMEM; 895 - goto err_mem_3; 858 + goto err_mem_1; 896 859 } 897 860 898 861 SET_NETDEV_DEV(dev, &pdev->dev); ··· 908 855 si->dev = &pdev->dev; 909 856 si->pdata = pdev->dev.platform_data; 910 857 858 + si->irda_base = ficp; 859 + si->stuart_base = stuart; 911 860 si->uart_irq = platform_get_irq(pdev, 0); 912 861 si->icp_irq = platform_get_irq(pdev, 1); 913 862 914 - si->sir_clk = clk_get(&pdev->dev, "UARTCLK"); 915 - si->fir_clk = clk_get(&pdev->dev, "FICPCLK"); 863 + si->sir_clk = devm_clk_get(&pdev->dev, "UARTCLK"); 864 + si->fir_clk = devm_clk_get(&pdev->dev, "FICPCLK"); 916 865 if (IS_ERR(si->sir_clk) || IS_ERR(si->fir_clk)) { 917 866 err = PTR_ERR(IS_ERR(si->sir_clk) ? si->sir_clk : si->fir_clk); 918 867 goto err_mem_4; ··· 979 924 err_mem_5: 980 925 kfree(si->rx_buff.head); 981 926 err_mem_4: 982 - if (si->sir_clk && !IS_ERR(si->sir_clk)) 983 - clk_put(si->sir_clk); 984 - if (si->fir_clk && !IS_ERR(si->fir_clk)) 985 - clk_put(si->fir_clk); 986 927 free_netdev(dev); 987 - err_mem_3: 988 - release_mem_region(__PREG(FICP), 0x1c); 989 - err_mem_2: 990 - release_mem_region(__PREG(STUART), 0x24); 991 928 } 992 929 err_mem_1: 993 930 return err; ··· 998 951 si->pdata->shutdown(si->dev); 999 952 kfree(si->tx_buff.head); 1000 953 kfree(si->rx_buff.head); 1001 - clk_put(si->fir_clk); 1002 - clk_put(si->sir_clk); 1003 954 free_netdev(dev); 1004 955 } 1005 - 1006 - release_mem_region(__PREG(STUART), 0x24); 1007 - release_mem_region(__PREG(FICP), 0x1c); 1008 956 1009 957 return 0; 1010 958 }