mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-29 08:01:08 +00:00
pci: layerscape: Use pci_generic_mmap_{read, write}_config
Use the new helpers to avoid boilerplate in the driver. Signed-off-by: Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
75e3feac1b
commit
e434a90ec4
1 changed files with 17 additions and 51 deletions
|
@ -241,14 +241,19 @@ static int ls_pcie_addr_valid(struct ls_pcie *pcie, pci_dev_t bdf)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void *ls_pcie_conf_address(struct ls_pcie *pcie, pci_dev_t bdf,
|
||||
int offset)
|
||||
int ls_pcie_conf_address(struct udevice *bus, pci_dev_t bdf,
|
||||
uint offset, void **paddress)
|
||||
{
|
||||
struct udevice *bus = pcie->bus;
|
||||
struct ls_pcie *pcie = dev_get_priv(bus);
|
||||
u32 busdev;
|
||||
|
||||
if (PCI_BUS(bdf) == bus->seq)
|
||||
return pcie->dbi + offset;
|
||||
if (ls_pcie_addr_valid(pcie, bdf))
|
||||
return -EINVAL;
|
||||
|
||||
if (PCI_BUS(bdf) == bus->seq) {
|
||||
*paddress = pcie->dbi + offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
busdev = PCIE_ATU_BUS(PCI_BUS(bdf)) |
|
||||
PCIE_ATU_DEV(PCI_DEV(bdf)) |
|
||||
|
@ -256,67 +261,28 @@ void *ls_pcie_conf_address(struct ls_pcie *pcie, pci_dev_t bdf,
|
|||
|
||||
if (PCI_BUS(bdf) == bus->seq + 1) {
|
||||
ls_pcie_cfg0_set_busdev(pcie, busdev);
|
||||
return pcie->cfg0 + offset;
|
||||
*paddress = pcie->cfg0 + offset;
|
||||
} else {
|
||||
ls_pcie_cfg1_set_busdev(pcie, busdev);
|
||||
return pcie->cfg1 + offset;
|
||||
*paddress = pcie->cfg1 + offset;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ls_pcie_read_config(struct udevice *bus, pci_dev_t bdf,
|
||||
uint offset, ulong *valuep,
|
||||
enum pci_size_t size)
|
||||
{
|
||||
struct ls_pcie *pcie = dev_get_priv(bus);
|
||||
void *address;
|
||||
|
||||
if (ls_pcie_addr_valid(pcie, bdf)) {
|
||||
*valuep = pci_get_ff(size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
address = ls_pcie_conf_address(pcie, bdf, offset);
|
||||
|
||||
switch (size) {
|
||||
case PCI_SIZE_8:
|
||||
*valuep = readb(address);
|
||||
return 0;
|
||||
case PCI_SIZE_16:
|
||||
*valuep = readw(address);
|
||||
return 0;
|
||||
case PCI_SIZE_32:
|
||||
*valuep = readl(address);
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return pci_generic_mmap_read_config(bus, ls_pcie_conf_address,
|
||||
bdf, offset, valuep, size);
|
||||
}
|
||||
|
||||
static int ls_pcie_write_config(struct udevice *bus, pci_dev_t bdf,
|
||||
uint offset, ulong value,
|
||||
enum pci_size_t size)
|
||||
{
|
||||
struct ls_pcie *pcie = dev_get_priv(bus);
|
||||
void *address;
|
||||
|
||||
if (ls_pcie_addr_valid(pcie, bdf))
|
||||
return 0;
|
||||
|
||||
address = ls_pcie_conf_address(pcie, bdf, offset);
|
||||
|
||||
switch (size) {
|
||||
case PCI_SIZE_8:
|
||||
writeb(value, address);
|
||||
return 0;
|
||||
case PCI_SIZE_16:
|
||||
writew(value, address);
|
||||
return 0;
|
||||
case PCI_SIZE_32:
|
||||
writel(value, address);
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return pci_generic_mmap_write_config(bus, ls_pcie_conf_address,
|
||||
bdf, offset, value, size);
|
||||
}
|
||||
|
||||
/* Clear multi-function bit */
|
||||
|
|
Loading…
Reference in a new issue