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

Merge tag 'drivers-3.13-2' of git://git.infradead.org/linux-mvebu into next/drivers

From Jason Cooper:
mvebu driver changes for v3.13 (round 2)

- mvebu
- pcie
- dynamic link up detection
- add IO wrappers
- declare some local functions static

* tag 'drivers-3.13-2' of git://git.infradead.org/linux-mvebu:
PCI: mvebu: make local functions static
PCI: mvebu: add I/O access wrappers
PCI: mvebu: Dynamically detect if the PEX link is up to enable hot plug

Signed-off-by: Kevin Hilman <khilman@linaro.org>

+69 -59
+69 -59
drivers/pci/host/pci-mvebu.c
··· 120 120 char *name; 121 121 void __iomem *base; 122 122 spinlock_t conf_lock; 123 - int haslink; 124 123 u32 port; 125 124 u32 lane; 126 125 int devfn; ··· 140 141 size_t iowin_size; 141 142 }; 142 143 144 + static inline void mvebu_writel(struct mvebu_pcie_port *port, u32 val, u32 reg) 145 + { 146 + writel(val, port->base + reg); 147 + } 148 + 149 + static inline u32 mvebu_readl(struct mvebu_pcie_port *port, u32 reg) 150 + { 151 + return readl(port->base + reg); 152 + } 153 + 143 154 static bool mvebu_pcie_link_up(struct mvebu_pcie_port *port) 144 155 { 145 - return !(readl(port->base + PCIE_STAT_OFF) & PCIE_STAT_LINK_DOWN); 156 + return !(mvebu_readl(port, PCIE_STAT_OFF) & PCIE_STAT_LINK_DOWN); 146 157 } 147 158 148 159 static void mvebu_pcie_set_local_bus_nr(struct mvebu_pcie_port *port, int nr) 149 160 { 150 161 u32 stat; 151 162 152 - stat = readl(port->base + PCIE_STAT_OFF); 163 + stat = mvebu_readl(port, PCIE_STAT_OFF); 153 164 stat &= ~PCIE_STAT_BUS; 154 165 stat |= nr << 8; 155 - writel(stat, port->base + PCIE_STAT_OFF); 166 + mvebu_writel(port, stat, PCIE_STAT_OFF); 156 167 } 157 168 158 169 static void mvebu_pcie_set_local_dev_nr(struct mvebu_pcie_port *port, int nr) 159 170 { 160 171 u32 stat; 161 172 162 - stat = readl(port->base + PCIE_STAT_OFF); 173 + stat = mvebu_readl(port, PCIE_STAT_OFF); 163 174 stat &= ~PCIE_STAT_DEV; 164 175 stat |= nr << 16; 165 - writel(stat, port->base + PCIE_STAT_OFF); 176 + mvebu_writel(port, stat, PCIE_STAT_OFF); 166 177 } 167 178 168 179 /* ··· 190 181 191 182 /* First, disable and clear BARs and windows. */ 192 183 for (i = 1; i < 3; i++) { 193 - writel(0, port->base + PCIE_BAR_CTRL_OFF(i)); 194 - writel(0, port->base + PCIE_BAR_LO_OFF(i)); 195 - writel(0, port->base + PCIE_BAR_HI_OFF(i)); 184 + mvebu_writel(port, 0, PCIE_BAR_CTRL_OFF(i)); 185 + mvebu_writel(port, 0, PCIE_BAR_LO_OFF(i)); 186 + mvebu_writel(port, 0, PCIE_BAR_HI_OFF(i)); 196 187 } 197 188 198 189 for (i = 0; i < 5; i++) { 199 - writel(0, port->base + PCIE_WIN04_CTRL_OFF(i)); 200 - writel(0, port->base + PCIE_WIN04_BASE_OFF(i)); 201 - writel(0, port->base + PCIE_WIN04_REMAP_OFF(i)); 190 + mvebu_writel(port, 0, PCIE_WIN04_CTRL_OFF(i)); 191 + mvebu_writel(port, 0, PCIE_WIN04_BASE_OFF(i)); 192 + mvebu_writel(port, 0, PCIE_WIN04_REMAP_OFF(i)); 202 193 } 203 194 204 - writel(0, port->base + PCIE_WIN5_CTRL_OFF); 205 - writel(0, port->base + PCIE_WIN5_BASE_OFF); 206 - writel(0, port->base + PCIE_WIN5_REMAP_OFF); 195 + mvebu_writel(port, 0, PCIE_WIN5_CTRL_OFF); 196 + mvebu_writel(port, 0, PCIE_WIN5_BASE_OFF); 197 + mvebu_writel(port, 0, PCIE_WIN5_REMAP_OFF); 207 198 208 199 /* Setup windows for DDR banks. Count total DDR size on the fly. */ 209 200 size = 0; 210 201 for (i = 0; i < dram->num_cs; i++) { 211 202 const struct mbus_dram_window *cs = dram->cs + i; 212 203 213 - writel(cs->base & 0xffff0000, 214 - port->base + PCIE_WIN04_BASE_OFF(i)); 215 - writel(0, port->base + PCIE_WIN04_REMAP_OFF(i)); 216 - writel(((cs->size - 1) & 0xffff0000) | 217 - (cs->mbus_attr << 8) | 218 - (dram->mbus_dram_target_id << 4) | 1, 219 - port->base + PCIE_WIN04_CTRL_OFF(i)); 204 + mvebu_writel(port, cs->base & 0xffff0000, 205 + PCIE_WIN04_BASE_OFF(i)); 206 + mvebu_writel(port, 0, PCIE_WIN04_REMAP_OFF(i)); 207 + mvebu_writel(port, 208 + ((cs->size - 1) & 0xffff0000) | 209 + (cs->mbus_attr << 8) | 210 + (dram->mbus_dram_target_id << 4) | 1, 211 + PCIE_WIN04_CTRL_OFF(i)); 220 212 221 213 size += cs->size; 222 214 } ··· 227 217 size = 1 << fls(size); 228 218 229 219 /* Setup BAR[1] to all DRAM banks. */ 230 - writel(dram->cs[0].base, port->base + PCIE_BAR_LO_OFF(1)); 231 - writel(0, port->base + PCIE_BAR_HI_OFF(1)); 232 - writel(((size - 1) & 0xffff0000) | 1, 233 - port->base + PCIE_BAR_CTRL_OFF(1)); 220 + mvebu_writel(port, dram->cs[0].base, PCIE_BAR_LO_OFF(1)); 221 + mvebu_writel(port, 0, PCIE_BAR_HI_OFF(1)); 222 + mvebu_writel(port, ((size - 1) & 0xffff0000) | 1, 223 + PCIE_BAR_CTRL_OFF(1)); 234 224 } 235 225 236 226 static void mvebu_pcie_setup_hw(struct mvebu_pcie_port *port) 237 227 { 238 - u16 cmd; 239 - u32 mask; 228 + u32 cmd, mask; 240 229 241 230 /* Point PCIe unit MBUS decode windows to DRAM space. */ 242 231 mvebu_pcie_setup_wins(port); 243 232 244 233 /* Master + slave enable. */ 245 - cmd = readw(port->base + PCIE_CMD_OFF); 234 + cmd = mvebu_readl(port, PCIE_CMD_OFF); 246 235 cmd |= PCI_COMMAND_IO; 247 236 cmd |= PCI_COMMAND_MEMORY; 248 237 cmd |= PCI_COMMAND_MASTER; 249 - writew(cmd, port->base + PCIE_CMD_OFF); 238 + mvebu_writel(port, cmd, PCIE_CMD_OFF); 250 239 251 240 /* Enable interrupt lines A-D. */ 252 - mask = readl(port->base + PCIE_MASK_OFF); 241 + mask = mvebu_readl(port, PCIE_MASK_OFF); 253 242 mask |= PCIE_MASK_ENABLE_INTS; 254 - writel(mask, port->base + PCIE_MASK_OFF); 243 + mvebu_writel(port, mask, PCIE_MASK_OFF); 255 244 } 256 245 257 246 static int mvebu_pcie_hw_rd_conf(struct mvebu_pcie_port *port, 258 247 struct pci_bus *bus, 259 248 u32 devfn, int where, int size, u32 *val) 260 249 { 261 - writel(PCIE_CONF_ADDR(bus->number, devfn, where), 262 - port->base + PCIE_CONF_ADDR_OFF); 250 + mvebu_writel(port, PCIE_CONF_ADDR(bus->number, devfn, where), 251 + PCIE_CONF_ADDR_OFF); 263 252 264 - *val = readl(port->base + PCIE_CONF_DATA_OFF); 253 + *val = mvebu_readl(port, PCIE_CONF_DATA_OFF); 265 254 266 255 if (size == 1) 267 256 *val = (*val >> (8 * (where & 3))) & 0xff; ··· 274 265 struct pci_bus *bus, 275 266 u32 devfn, int where, int size, u32 val) 276 267 { 277 - int ret = PCIBIOS_SUCCESSFUL; 268 + u32 _val, shift = 8 * (where & 3); 278 269 279 - writel(PCIE_CONF_ADDR(bus->number, devfn, where), 280 - port->base + PCIE_CONF_ADDR_OFF); 270 + mvebu_writel(port, PCIE_CONF_ADDR(bus->number, devfn, where), 271 + PCIE_CONF_ADDR_OFF); 272 + _val = mvebu_readl(port, PCIE_CONF_DATA_OFF); 281 273 282 274 if (size == 4) 283 - writel(val, port->base + PCIE_CONF_DATA_OFF); 275 + _val = val; 284 276 else if (size == 2) 285 - writew(val, port->base + PCIE_CONF_DATA_OFF + (where & 3)); 277 + _val = (_val & ~(0xffff << shift)) | ((val & 0xffff) << shift); 286 278 else if (size == 1) 287 - writeb(val, port->base + PCIE_CONF_DATA_OFF + (where & 3)); 279 + _val = (_val & ~(0xff << shift)) | ((val & 0xff) << shift); 288 280 else 289 - ret = PCIBIOS_BAD_REGISTER_NUMBER; 281 + return PCIBIOS_BAD_REGISTER_NUMBER; 290 282 291 - return ret; 283 + mvebu_writel(port, _val, PCIE_CONF_DATA_OFF); 284 + 285 + return PCIBIOS_SUCCESSFUL; 292 286 } 293 287 294 288 static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port) ··· 572 560 if (bus->number == 0) 573 561 return mvebu_sw_pci_bridge_write(port, where, size, val); 574 562 575 - if (!port->haslink) 563 + if (!mvebu_pcie_link_up(port)) 576 564 return PCIBIOS_DEVICE_NOT_FOUND; 577 565 578 566 /* ··· 614 602 if (bus->number == 0) 615 603 return mvebu_sw_pci_bridge_read(port, where, size, val); 616 604 617 - if (!port->haslink) { 605 + if (!mvebu_pcie_link_up(port)) { 618 606 *val = 0xffffffff; 619 607 return PCIBIOS_DEVICE_NOT_FOUND; 620 608 } ··· 693 681 return bus; 694 682 } 695 683 696 - void mvebu_pcie_add_bus(struct pci_bus *bus) 684 + static void mvebu_pcie_add_bus(struct pci_bus *bus) 697 685 { 698 686 struct mvebu_pcie *pcie = sys_to_pcie(bus->sysdata); 699 687 bus->msi = pcie->msi; 700 688 } 701 689 702 - resource_size_t mvebu_pcie_align_resource(struct pci_dev *dev, 703 - const struct resource *res, 704 - resource_size_t start, 705 - resource_size_t size, 706 - resource_size_t align) 690 + static resource_size_t mvebu_pcie_align_resource(struct pci_dev *dev, 691 + const struct resource *res, 692 + resource_size_t start, 693 + resource_size_t size, 694 + resource_size_t align) 707 695 { 708 696 if (dev->bus->number != 0) 709 697 return start; ··· 962 950 963 951 mvebu_pcie_set_local_dev_nr(port, 1); 964 952 965 - if (mvebu_pcie_link_up(port)) { 966 - port->haslink = 1; 967 - dev_info(&pdev->dev, "PCIe%d.%d: link up\n", 968 - port->port, port->lane); 969 - } else { 970 - port->haslink = 0; 971 - dev_info(&pdev->dev, "PCIe%d.%d: link down\n", 972 - port->port, port->lane); 953 + port->clk = of_clk_get_by_name(child, NULL); 954 + if (IS_ERR(port->clk)) { 955 + dev_err(&pdev->dev, "PCIe%d.%d: cannot get clock\n", 956 + port->port, port->lane); 957 + iounmap(port->base); 958 + continue; 973 959 } 974 960 975 961 port->dn = child;