diff options
| author | Rob Herring <robh@kernel.org> | 2015-01-09 21:34:40 -0500 |
|---|---|---|
| committer | Bjorn Helgaas <bhelgaas@google.com> | 2015-01-22 15:05:38 -0500 |
| commit | 802b7c06adc7186da59110ad136d88919fdb180b (patch) | |
| tree | 054f885ed3b2730a05c4dada8b97d70bf3d28fb8 | |
| parent | 1f94a94f67e1083e19fb7b436dd7ca7a4ba03f2b (diff) | |
ARM: cns3xxx: Convert PCI to use generic config accessors
Convert the cns3xxx PCI driver to use the generic config access functions.
This changes accesses from __raw_readl/__raw_writel to readl/writel.
[arnd: remove extra open parenthesis]
Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Krzysztof HaĆasa <khalasa@piap.pl>
CC: Russell King <linux@arm.linux.org.uk>
CC: linux-arm-kernel@lists.infradead.org
| -rw-r--r-- | arch/arm/mach-cns3xxx/pcie.c | 52 |
1 files changed, 10 insertions, 42 deletions
diff --git a/arch/arm/mach-cns3xxx/pcie.c b/arch/arm/mach-cns3xxx/pcie.c index 45d6bd09e6ef..85fc72e875d2 100644 --- a/arch/arm/mach-cns3xxx/pcie.c +++ b/arch/arm/mach-cns3xxx/pcie.c | |||
| @@ -54,8 +54,8 @@ static struct cns3xxx_pcie *pbus_to_cnspci(struct pci_bus *bus) | |||
| 54 | return sysdata_to_cnspci(bus->sysdata); | 54 | return sysdata_to_cnspci(bus->sysdata); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | static void __iomem *cns3xxx_pci_cfg_base(struct pci_bus *bus, | 57 | static void __iomem *cns3xxx_pci_map_bus(struct pci_bus *bus, |
| 58 | unsigned int devfn, int where) | 58 | unsigned int devfn, int where) |
| 59 | { | 59 | { |
| 60 | struct cns3xxx_pcie *cnspci = pbus_to_cnspci(bus); | 60 | struct cns3xxx_pcie *cnspci = pbus_to_cnspci(bus); |
| 61 | int busno = bus->number; | 61 | int busno = bus->number; |
| @@ -91,55 +91,22 @@ static void __iomem *cns3xxx_pci_cfg_base(struct pci_bus *bus, | |||
| 91 | static int cns3xxx_pci_read_config(struct pci_bus *bus, unsigned int devfn, | 91 | static int cns3xxx_pci_read_config(struct pci_bus *bus, unsigned int devfn, |
| 92 | int where, int size, u32 *val) | 92 | int where, int size, u32 *val) |
| 93 | { | 93 | { |
| 94 | u32 v; | 94 | int ret; |
| 95 | void __iomem *base; | ||
| 96 | u32 mask = (0x1ull << (size * 8)) - 1; | 95 | u32 mask = (0x1ull << (size * 8)) - 1; |
| 97 | int shift = (where % 4) * 8; | 96 | int shift = (where % 4) * 8; |
| 98 | 97 | ||
| 99 | base = cns3xxx_pci_cfg_base(bus, devfn, where); | 98 | ret = pci_generic_config_read32(bus, devfn, where, size, val); |
| 100 | if (!base) { | ||
| 101 | *val = 0xffffffff; | ||
| 102 | return PCIBIOS_SUCCESSFUL; | ||
| 103 | } | ||
| 104 | |||
| 105 | v = __raw_readl(base); | ||
| 106 | 99 | ||
| 107 | if (bus->number == 0 && devfn == 0 && | 100 | if (ret == PCIBIOS_SUCCESSFUL && !bus->number && !devfn && |
| 108 | (where & 0xffc) == PCI_CLASS_REVISION) { | 101 | (where & 0xffc) == PCI_CLASS_REVISION) |
| 109 | /* | 102 | /* |
| 110 | * RC's class is 0xb, but Linux PCI driver needs 0x604 | 103 | * RC's class is 0xb, but Linux PCI driver needs 0x604 |
| 111 | * for a PCIe bridge. So we must fixup the class code | 104 | * for a PCIe bridge. So we must fixup the class code |
| 112 | * to 0x604 here. | 105 | * to 0x604 here. |
| 113 | */ | 106 | */ |
| 114 | v &= 0xff; | 107 | *val = ((((*val << shift) & 0xff) | (0x604 << 16)) >> shift) & mask; |
| 115 | v |= 0x604 << 16; | ||
| 116 | } | ||
| 117 | |||
| 118 | *val = (v >> shift) & mask; | ||
| 119 | |||
| 120 | return PCIBIOS_SUCCESSFUL; | ||
| 121 | } | ||
| 122 | |||
| 123 | static int cns3xxx_pci_write_config(struct pci_bus *bus, unsigned int devfn, | ||
| 124 | int where, int size, u32 val) | ||
| 125 | { | ||
| 126 | u32 v; | ||
| 127 | void __iomem *base; | ||
| 128 | u32 mask = (0x1ull << (size * 8)) - 1; | ||
| 129 | int shift = (where % 4) * 8; | ||
| 130 | |||
| 131 | base = cns3xxx_pci_cfg_base(bus, devfn, where); | ||
| 132 | if (!base) | ||
| 133 | return PCIBIOS_SUCCESSFUL; | ||
| 134 | |||
| 135 | v = __raw_readl(base); | ||
| 136 | |||
| 137 | v &= ~(mask << shift); | ||
| 138 | v |= (val & mask) << shift; | ||
| 139 | |||
| 140 | __raw_writel(v, base); | ||
| 141 | 108 | ||
| 142 | return PCIBIOS_SUCCESSFUL; | 109 | return ret; |
| 143 | } | 110 | } |
| 144 | 111 | ||
| 145 | static int cns3xxx_pci_setup(int nr, struct pci_sys_data *sys) | 112 | static int cns3xxx_pci_setup(int nr, struct pci_sys_data *sys) |
| @@ -158,8 +125,9 @@ static int cns3xxx_pci_setup(int nr, struct pci_sys_data *sys) | |||
| 158 | } | 125 | } |
| 159 | 126 | ||
| 160 | static struct pci_ops cns3xxx_pcie_ops = { | 127 | static struct pci_ops cns3xxx_pcie_ops = { |
| 128 | .map_bus = cns3xxx_pci_map_bus, | ||
| 161 | .read = cns3xxx_pci_read_config, | 129 | .read = cns3xxx_pci_read_config, |
| 162 | .write = cns3xxx_pci_write_config, | 130 | .write = pci_generic_config_write, |
| 163 | }; | 131 | }; |
| 164 | 132 | ||
| 165 | static int cns3xxx_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | 133 | static int cns3xxx_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) |
