aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Herring <robh@kernel.org>2015-01-09 21:34:40 -0500
committerBjorn Helgaas <bhelgaas@google.com>2015-01-22 15:05:38 -0500
commit802b7c06adc7186da59110ad136d88919fdb180b (patch)
tree054f885ed3b2730a05c4dada8b97d70bf3d28fb8
parent1f94a94f67e1083e19fb7b436dd7ca7a4ba03f2b (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.c52
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
57static void __iomem *cns3xxx_pci_cfg_base(struct pci_bus *bus, 57static 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,
91static int cns3xxx_pci_read_config(struct pci_bus *bus, unsigned int devfn, 91static 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
123static 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
145static int cns3xxx_pci_setup(int nr, struct pci_sys_data *sys) 112static 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
160static struct pci_ops cns3xxx_pcie_ops = { 127static 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
165static int cns3xxx_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) 133static int cns3xxx_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)