Changeset 44719


Ignore:
Timestamp:
2015-03-13T04:00:19+01:00 (3 years ago)
Author:
nbd
Message:

atheros: v3.18: add context container for PCI driver

Add container and place all context specific variables and structure to
it.

Signed-off-by: Sergey Ryazanov <ryazanov.s.a@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros/patches-3.18/105-ar2315_pci.patch

    r44718 r44719  
    1111--- /dev/null 
    1212+++ b/arch/mips/pci/pci-ar2315.c 
    13 @@ -0,0 +1,428 @@ 
     13@@ -0,0 +1,445 @@ 
    1414+/* 
    1515+ * This program is free software; you can redistribute it and/or 
     
    173173+#define AR2315_PCI_HOST_MBAR2          0x30000000 
    174174+ 
    175 +static void __iomem *ar2315_pci_cfg_mem; 
    176 + 
    177 +static int ar2315_pci_cfg_access(int devfn, int where, int size, u32 *ptr, 
    178 +                                bool write) 
     175+struct ar2315_pci_ctrl { 
     176+       void __iomem *cfg_mem; 
     177+       struct pci_controller pci_ctrl; 
     178+       struct resource mem_res; 
     179+       struct resource io_res; 
     180+}; 
     181+ 
     182+static inline struct ar2315_pci_ctrl *ar2315_pci_bus_to_apc(struct pci_bus *bus) 
     183+{ 
     184+       struct pci_controller *hose = bus->sysdata; 
     185+ 
     186+       return container_of(hose, struct ar2315_pci_ctrl, pci_ctrl); 
     187+} 
     188+ 
     189+static int ar2315_pci_cfg_access(struct ar2315_pci_ctrl *apc, unsigned devfn, 
     190+                                int where, int size, u32 *ptr, bool write) 
    179191+{ 
    180192+       int func = PCI_FUNC(devfn); 
     
    196208+       mb();   /* PCI must see space change before we begin */ 
    197209+ 
    198 +       value = __raw_readl(ar2315_pci_cfg_mem + addr); 
     210+       value = __raw_readl(apc->cfg_mem + addr); 
    199211+ 
    200212+       isr = ar231x_read_reg(AR2315_PCI_ISR); 
     
    204216+       if (write) { 
    205217+               value = (value & ~(mask << sh)) | *ptr << sh; 
    206 +               __raw_writel(value, ar2315_pci_cfg_mem + addr); 
     218+               __raw_writel(value, apc->cfg_mem + addr); 
    207219+               isr = ar231x_read_reg(AR2315_PCI_ISR); 
    208220+               if (isr & AR2315_PCI_INT_ABORT) 
     
    227239+} 
    228240+ 
    229 +static inline int ar2315_pci_local_cfg_rd(unsigned devfn, int where, u32 *val) 
    230 +{ 
    231 +       return ar2315_pci_cfg_access(devfn, where, sizeof(u32), val, false); 
    232 +} 
    233 + 
    234 +static inline int ar2315_pci_local_cfg_wr(unsigned devfn, int where, u32 val) 
    235 +{ 
    236 +       return ar2315_pci_cfg_access(devfn, where, sizeof(u32), &val, true); 
    237 +} 
    238 + 
    239 +static int ar2315_pci_cfg_read(struct pci_bus *bus, unsigned int devfn, 
    240 +                              int where, int size, u32 *value) 
    241 +{ 
     241+static inline int ar2315_pci_local_cfg_rd(struct ar2315_pci_ctrl *apc, 
     242+                                         unsigned devfn, int where, u32 *val) 
     243+{ 
     244+       return ar2315_pci_cfg_access(apc, devfn, where, sizeof(u32), val, 
     245+                                    false); 
     246+} 
     247+ 
     248+static inline int ar2315_pci_local_cfg_wr(struct ar2315_pci_ctrl *apc, 
     249+                                         unsigned devfn, int where, u32 val) 
     250+{ 
     251+       return ar2315_pci_cfg_access(apc, devfn, where, sizeof(u32), &val, 
     252+                                    true); 
     253+} 
     254+ 
     255+static int ar2315_pci_cfg_read(struct pci_bus *bus, unsigned devfn, int where, 
     256+                              int size, u32 *value) 
     257+{ 
     258+       struct ar2315_pci_ctrl *apc = ar2315_pci_bus_to_apc(bus); 
     259+ 
    242260+       if (PCI_SLOT(devfn) == AR2315_PCI_HOST_SLOT) 
    243261+               return PCIBIOS_DEVICE_NOT_FOUND; 
    244262+ 
    245 +       return ar2315_pci_cfg_access(devfn, where, size, value, 0); 
    246 +} 
    247 + 
    248 +static int ar2315_pci_cfg_write(struct pci_bus *bus, unsigned int devfn, 
    249 +                               int where, int size, u32 value) 
    250 +{ 
     263+       return ar2315_pci_cfg_access(apc, devfn, where, size, value, false); 
     264+} 
     265+ 
     266+static int ar2315_pci_cfg_write(struct pci_bus *bus, unsigned devfn, int where, 
     267+                               int size, u32 value) 
     268+{ 
     269+       struct ar2315_pci_ctrl *apc = ar2315_pci_bus_to_apc(bus); 
     270+ 
    251271+       if (PCI_SLOT(devfn) == AR2315_PCI_HOST_SLOT) 
    252272+               return PCIBIOS_DEVICE_NOT_FOUND; 
    253273+ 
    254 +       return ar2315_pci_cfg_access(devfn, where, size, &value, 1); 
     274+       return ar2315_pci_cfg_access(apc, devfn, where, size, &value, true); 
    255275+} 
    256276+ 
     
    260280+}; 
    261281+ 
    262 +static struct resource ar2315_mem_resource = { 
    263 +       .name   = "ar2315-pci-mem", 
    264 +       .start  = AR2315_PCIEXT, 
    265 +       .end    = AR2315_PCIEXT + AR2315_PCIEXT_SZ - 1, 
    266 +       .flags  = IORESOURCE_MEM, 
    267 +}; 
    268 + 
    269 +/* PCI controller does not support I/O ports */ 
    270 +static struct resource ar2315_io_resource = { 
    271 +       .name   = "ar2315-pci-io", 
    272 +       .start  = 0, 
    273 +       .end    = 0, 
    274 +       .flags  = IORESOURCE_IO, 
    275 +}; 
    276 + 
    277 +static struct pci_controller ar2315_pci_controller = { 
    278 +       .pci_ops        = &ar2315_pci_ops, 
    279 +       .mem_resource   = &ar2315_mem_resource, 
    280 +       .io_resource    = &ar2315_io_resource, 
    281 +       .mem_offset     = 0x00000000UL, 
    282 +       .io_offset      = 0x00000000UL, 
    283 +}; 
    284 + 
    285 +static int ar2315_pci_host_setup(void) 
     282+static int ar2315_pci_host_setup(struct ar2315_pci_ctrl *apc) 
    286283+{ 
    287284+       unsigned devfn = PCI_DEVFN(AR2315_PCI_HOST_SLOT, 0); 
     
    289286+       u32 id; 
    290287+ 
    291 +       res = ar2315_pci_local_cfg_rd(devfn, PCI_VENDOR_ID, &id); 
     288+       res = ar2315_pci_local_cfg_rd(apc, devfn, PCI_VENDOR_ID, &id); 
    292289+       if (res != PCIBIOS_SUCCESSFUL || id != AR2315_PCI_HOST_DEVID) 
    293290+               return -ENODEV; 
    294291+ 
    295292+       /* Program MBARs */ 
    296 +       ar2315_pci_local_cfg_wr(devfn, PCI_BASE_ADDRESS_0, 
     293+       ar2315_pci_local_cfg_wr(apc, devfn, PCI_BASE_ADDRESS_0, 
    297294+                               AR2315_PCI_HOST_MBAR0); 
    298 +       ar2315_pci_local_cfg_wr(devfn, PCI_BASE_ADDRESS_1, 
     295+       ar2315_pci_local_cfg_wr(apc, devfn, PCI_BASE_ADDRESS_1, 
    299296+                               AR2315_PCI_HOST_MBAR1); 
    300 +       ar2315_pci_local_cfg_wr(devfn, PCI_BASE_ADDRESS_2, 
     297+       ar2315_pci_local_cfg_wr(apc, devfn, PCI_BASE_ADDRESS_2, 
    301298+                               AR2315_PCI_HOST_MBAR2); 
    302299+ 
    303300+       /* Run */ 
    304 +       ar2315_pci_local_cfg_wr(devfn, PCI_COMMAND, PCI_COMMAND_MEMORY | 
     301+       ar2315_pci_local_cfg_wr(apc, devfn, PCI_COMMAND, PCI_COMMAND_MEMORY | 
    305302+                               PCI_COMMAND_MASTER | PCI_COMMAND_SPECIAL | 
    306303+                               PCI_COMMAND_INVALIDATE | PCI_COMMAND_PARITY | 
     
    378375+static int ar2315_pci_probe(struct platform_device *pdev) 
    379376+{ 
     377+       struct ar2315_pci_ctrl *apc; 
    380378+       struct device *dev = &pdev->dev; 
    381 +       int res; 
     379+       int err; 
     380+ 
     381+       apc = devm_kzalloc(dev, sizeof(*apc), GFP_KERNEL); 
     382+       if (!apc) 
     383+               return -ENOMEM; 
     384+ 
     385+       apc->mem_res.name = "AR2315 PCI mem space"; 
     386+       apc->mem_res.start = AR2315_PCIEXT; 
     387+       apc->mem_res.end = AR2315_PCIEXT + AR2315_PCIEXT_SZ - 1; 
     388+       apc->mem_res.flags = IORESOURCE_MEM; 
    382389+ 
    383390+       /* Remap PCI config space */ 
    384 +       ar2315_pci_cfg_mem = devm_ioremap_nocache(dev, AR2315_PCIEXT, 
    385 +                                                 AR2315_PCI_CFG_SIZE); 
    386 +       if (!ar2315_pci_cfg_mem) { 
     391+       apc->cfg_mem = devm_ioremap_nocache(dev, AR2315_PCIEXT, 
     392+                                           AR2315_PCI_CFG_SIZE); 
     393+       if (!apc->cfg_mem) { 
    387394+               dev_err(dev, "failed to remap PCI config space\n"); 
    388395+               return -ENOMEM; 
     
    406413+       msleep(500); 
    407414+ 
    408 +       res = ar2315_pci_host_setup(); 
    409 +       if (res) 
    410 +               return res; 
     415+       err = ar2315_pci_host_setup(apc); 
     416+       if (err) 
     417+               return err; 
    411418+ 
    412419+       ar2315_pci_irq_init(); 
    413420+ 
    414 +       register_pci_controller(&ar2315_pci_controller); 
     421+       /* PCI controller does not support I/O ports */ 
     422+       apc->io_res.name = "AR2315 IO space"; 
     423+       apc->io_res.start = 0; 
     424+       apc->io_res.end = 0; 
     425+       apc->io_res.flags = IORESOURCE_IO, 
     426+ 
     427+       apc->pci_ctrl.pci_ops = &ar2315_pci_ops; 
     428+       apc->pci_ctrl.mem_resource = &apc->mem_res, 
     429+       apc->pci_ctrl.io_resource = &apc->io_res, 
     430+ 
     431+       register_pci_controller(&apc->pci_ctrl); 
    415432+ 
    416433+       return 0; 
Note: See TracChangeset for help on using the changeset viewer.