Changeset 20287


Ignore:
Timestamp:
2010-03-18T20:19:16+01:00 (8 years ago)
Author:
juhosg
Message:

ar71xx: optimize register access in ar71xx_pci.c

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/files/arch/mips/pci/pci-ar71xx.c

    r20281 r20287  
    22 *  Atheros AR71xx PCI host controller driver 
    33 * 
    4  *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org> 
     4 *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> 
    55 *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> 
    66 * 
     
    4747} 
    4848 
    49 static inline u32 ar71xx_pcicfg_rr(unsigned int reg) 
    50 { 
    51         return __raw_readl(ar71xx_pcicfg_base + reg); 
    52 } 
    53  
    54 static inline void ar71xx_pcicfg_wr(unsigned int reg, u32 val) 
    55 { 
    56         __raw_writel(val, ar71xx_pcicfg_base + reg); 
    57 } 
    58  
    5949/* Byte lane enable bits */ 
    6050static u8 ble_table[4][4] = { 
     
    9585int ar71xx_pci_be_handler(int is_fixup) 
    9686{ 
     87        void __iomem *base = ar71xx_pcicfg_base; 
    9788        u32 pci_err; 
    9889        u32 ahb_err; 
    9990 
    100         pci_err = ar71xx_pcicfg_rr(PCI_REG_PCI_ERR) & 3; 
     91        pci_err = __raw_readl(base + PCI_REG_PCI_ERR) & 3; 
    10192        if (pci_err) { 
    10293                if (!is_fixup) 
    10394                        printk(KERN_ALERT "PCI error %d at PCI addr 0x%x\n", 
    10495                                pci_err, 
    105                                 ar71xx_pcicfg_rr(PCI_REG_PCI_ERR_ADDR)); 
    106  
    107                 ar71xx_pcicfg_wr(PCI_REG_PCI_ERR, pci_err); 
    108         } 
    109  
    110         ahb_err = ar71xx_pcicfg_rr(PCI_REG_AHB_ERR) & 1; 
     96                                __raw_readl(base + PCI_REG_PCI_ERR_ADDR)); 
     97 
     98                __raw_writel(pci_err, base + PCI_REG_PCI_ERR); 
     99        } 
     100 
     101        ahb_err = __raw_readl(base + PCI_REG_AHB_ERR) & 1; 
    111102        if (ahb_err) { 
    112103                if (!is_fixup) 
    113104                        printk(KERN_ALERT "AHB error at AHB address 0x%x\n", 
    114                                 ar71xx_pcicfg_rr(PCI_REG_AHB_ERR_ADDR)); 
    115  
    116                 ar71xx_pcicfg_wr(PCI_REG_AHB_ERR, ahb_err); 
     105                                __raw_readl(base + PCI_REG_AHB_ERR_ADDR)); 
     106 
     107                __raw_writel(ahb_err, base + PCI_REG_AHB_ERR); 
    117108        } 
    118109 
     
    123114                        unsigned int devfn, int where, int size, u32 cmd) 
    124115{ 
     116        void __iomem *base = ar71xx_pcicfg_base; 
    125117        u32 addr; 
    126118 
     
    131123                where, size, addr); 
    132124 
    133         ar71xx_pcicfg_wr(PCI_REG_CFG_AD, addr); 
    134         ar71xx_pcicfg_wr(PCI_REG_CFG_CBE, 
    135                         cmd | ar71xx_pci_get_ble(where, size, 0)); 
     125        __raw_writel(addr, base + PCI_REG_CFG_AD); 
     126        __raw_writel(cmd | ar71xx_pci_get_ble(where, size, 0), 
     127                     base + PCI_REG_CFG_CBE); 
    136128 
    137129        return ar71xx_pci_be_handler(1); 
     
    141133                                  int where, int size, u32 *value) 
    142134{ 
     135        void __iomem *base = ar71xx_pcicfg_base; 
    143136        static u32 mask[8] = {0, 0xff, 0xffff, 0, 0xffffffff, 0, 0, 0}; 
    144137        unsigned long flags; 
     
    158151                t = PCI_CRP_CMD_READ | (where & ~3); 
    159152 
    160                 ar71xx_pcicfg_wr(PCI_REG_CRP_AD_CBE, t); 
    161                 data = ar71xx_pcicfg_rr(PCI_REG_CRP_RDDATA); 
     153                __raw_writel(t, base + PCI_REG_CRP_AD_CBE); 
     154                data = __raw_readl(base + PCI_REG_CRP_RDDATA); 
    162155 
    163156                DBG("PCI: rd local cfg, ad_cbe:%08x, data:%08x\n", t, data); 
     
    170163 
    171164                if (err == 0) { 
    172                         data = ar71xx_pcicfg_rr(PCI_REG_CFG_RDDATA); 
     165                        data = __raw_readl(base + PCI_REG_CFG_RDDATA); 
    173166                } else { 
    174167                        ret = PCIBIOS_DEVICE_NOT_FOUND; 
     
    190183                                   int where, int size, u32 value) 
    191184{ 
     185        void __iomem *base = ar71xx_pcicfg_base; 
    192186        unsigned long flags; 
    193187        int ret; 
     
    209203                DBG("PCI: wr local cfg, ad_cbe:%08x, value:%08x\n", t, value); 
    210204 
    211                 ar71xx_pcicfg_wr(PCI_REG_CRP_AD_CBE, t); 
    212                 ar71xx_pcicfg_wr(PCI_REG_CRP_WRDATA, value); 
     205                __raw_writel(t, base + PCI_REG_CRP_AD_CBE); 
     206                __raw_writel(value, base + PCI_REG_CRP_WRDATA); 
    213207        } else { 
    214208                int err; 
     
    218212 
    219213                if (err == 0) 
    220                         ar71xx_pcicfg_wr(PCI_REG_CFG_WRDATA, value); 
     214                        __raw_writel(value, base + PCI_REG_CFG_WRDATA); 
    221215                else 
    222216                        ret = PCIBIOS_DEVICE_NOT_FOUND; 
     
    304298static void ar71xx_pci_irq_handler(unsigned int irq, struct irq_desc *desc) 
    305299{ 
     300        void __iomem *base = ar71xx_reset_base; 
    306301        u32 pending; 
    307302 
    308         pending = ar71xx_reset_rr(AR71XX_RESET_REG_PCI_INT_STATUS) & 
    309                   ar71xx_reset_rr(AR71XX_RESET_REG_PCI_INT_ENABLE); 
     303        pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) & 
     304                  __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); 
    310305 
    311306        if (pending & PCI_INT_DEV0) 
     
    327322static void ar71xx_pci_irq_unmask(unsigned int irq) 
    328323{ 
     324        void __iomem *base = ar71xx_reset_base; 
     325        u32 t; 
     326 
    329327        irq -= AR71XX_PCI_IRQ_BASE; 
    330         ar71xx_reset_wr(AR71XX_RESET_REG_PCI_INT_ENABLE, 
    331                 ar71xx_reset_rr(AR71XX_RESET_REG_PCI_INT_ENABLE) | (1 << irq)); 
     328 
     329        t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); 
     330        __raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); 
    332331 
    333332        /* flush write */ 
    334         ar71xx_reset_rr(AR71XX_RESET_REG_PCI_INT_ENABLE); 
     333        (void) __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); 
    335334} 
    336335 
    337336static void ar71xx_pci_irq_mask(unsigned int irq) 
    338337{ 
     338        void __iomem *base = ar71xx_reset_base; 
     339        u32 t; 
     340 
    339341        irq -= AR71XX_PCI_IRQ_BASE; 
    340         ar71xx_reset_wr(AR71XX_RESET_REG_PCI_INT_ENABLE, 
    341                 ar71xx_reset_rr(AR71XX_RESET_REG_PCI_INT_ENABLE) & ~(1 << irq)); 
     342 
     343        t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); 
     344        __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE); 
    342345 
    343346        /* flush write */ 
    344         ar71xx_reset_rr(AR71XX_RESET_REG_PCI_INT_ENABLE); 
     347        (void) __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE); 
    345348} 
    346349 
     
    354357static void __init ar71xx_pci_irq_init(void) 
    355358{ 
     359        void __iomem *base = ar71xx_reset_base; 
    356360        int i; 
    357361 
    358         ar71xx_reset_wr(AR71XX_RESET_REG_PCI_INT_ENABLE, 0); 
    359         ar71xx_reset_wr(AR71XX_RESET_REG_PCI_INT_STATUS, 0); 
     362        __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE); 
     363        __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS); 
    360364 
    361365        for (i = AR71XX_PCI_IRQ_BASE; 
     
    371375int __init ar71xx_pcibios_init(void) 
    372376{ 
     377        void __iomem *ddr_base = ar71xx_ddr_base; 
     378 
    373379        ar71xx_device_stop(RESET_MODULE_PCI_BUS | RESET_MODULE_PCI_CORE); 
    374380        ar71xx_pci_delay(); 
     
    380386                                                AR71XX_PCI_CFG_SIZE); 
    381387 
    382         ar71xx_ddr_wr(AR71XX_DDR_REG_PCI_WIN0, PCI_WIN0_OFFS); 
    383         ar71xx_ddr_wr(AR71XX_DDR_REG_PCI_WIN1, PCI_WIN1_OFFS); 
    384         ar71xx_ddr_wr(AR71XX_DDR_REG_PCI_WIN2, PCI_WIN2_OFFS); 
    385         ar71xx_ddr_wr(AR71XX_DDR_REG_PCI_WIN3, PCI_WIN3_OFFS); 
    386         ar71xx_ddr_wr(AR71XX_DDR_REG_PCI_WIN4, PCI_WIN4_OFFS); 
    387         ar71xx_ddr_wr(AR71XX_DDR_REG_PCI_WIN5, PCI_WIN5_OFFS); 
    388         ar71xx_ddr_wr(AR71XX_DDR_REG_PCI_WIN6, PCI_WIN6_OFFS); 
    389         ar71xx_ddr_wr(AR71XX_DDR_REG_PCI_WIN7, PCI_WIN7_OFFS); 
     388        __raw_writel(PCI_WIN0_OFFS, ddr_base + AR71XX_DDR_REG_PCI_WIN0); 
     389        __raw_writel(PCI_WIN1_OFFS, ddr_base + AR71XX_DDR_REG_PCI_WIN1); 
     390        __raw_writel(PCI_WIN2_OFFS, ddr_base + AR71XX_DDR_REG_PCI_WIN2); 
     391        __raw_writel(PCI_WIN3_OFFS, ddr_base + AR71XX_DDR_REG_PCI_WIN3); 
     392        __raw_writel(PCI_WIN4_OFFS, ddr_base + AR71XX_DDR_REG_PCI_WIN4); 
     393        __raw_writel(PCI_WIN5_OFFS, ddr_base + AR71XX_DDR_REG_PCI_WIN5); 
     394        __raw_writel(PCI_WIN6_OFFS, ddr_base + AR71XX_DDR_REG_PCI_WIN6); 
     395        __raw_writel(PCI_WIN7_OFFS, ddr_base + AR71XX_DDR_REG_PCI_WIN7); 
    390396 
    391397        ar71xx_pci_delay(); 
Note: See TracChangeset for help on using the changeset viewer.